perm filename MUSPLA.FAI[IRC,LCS] blob sn#273058 filedate 1977-03-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	SOUND  DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
C00006 00003		FIND OUT NUMBER OF CHANNELS AND THE SPEED.
C00013 00004		BEGIN MAIN BODY OF PROGRAM
C00018 ENDMK
C⊗;
	TITLE	SOUND;  DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******

;  ******CALL PLAY(NCHNS,SRATE)***** WHERE  ARGUMENTS ARE BOTH INTEGER.

;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;  NAME OF THE FILE TO BE INPUTTED IS 'TEST.SND'
;  THE FIRST RECORD OF WHICH CONTAINS THE
;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
;  ALSO INCLUDES FUNCTION TO CHECK ON DATADISC - FOR DPYS.

ENTRY PLAY,NOTDD  ;ALL BELOW (AFTER JOBREL) ARE FOR DPY CALLS ELSEWHERE.
EXTERNAL JOBREL,DPYSET,ALINE,DPYOUT,DDCLR,AIVECT,TYPLOC,RVECT
A   ←   1     ;WORK
B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
T1  ←   4     ; TEMP FOR ADSMAP (JAM)
BUFCNT ←5     ; BUFFER COUNTER FOR REPLAY FEATURE
REP ← 6;	;FOR REPLAY USETI
;;BUFSIZ ←=20224   ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!	
BUFSIZ ←4400*3	;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
↓DSKCHN ←4             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←3             ;D-A CHANNEL FOR OUTPUT

	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

;FUNCTION NOTDD(K)  --  IF NEG. IT'S NOT A DATADISC -- FOR 'SEE'
NOTDD:	0
	MOVNI	2,1
	GETLIN	2
	SETZ	;0=IT IS A DD
	TLNN	2,20000
	SETO	;-1=NOT DD
	JRA	16,1(16)

PLAY:	0
BEG:	;CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE

	MOVE 6,['TEST  ']
	MOVE 7,['SND   ']
	SETZM	DIR+3    ;FOR RESTART
	MOVE @1(16)	; GET SRATE
	IDIVI =12800	;NOW IT IS 0,1,2,4,8 OR 16.
	CAIN 4
	MOVEI 3		;4 GOES TO 3
	CAIN =8
	MOVEI 4		;8 GOES TO 4
	CAIN =16
	MOVEI 5		;16 GOES TO 5
	MOVEM SAVSPD	;INIT SAVSPD
	MOVEM 6,DIR
	MOVEM 7,DIR+1


	;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
	MOVE A,@(16)		; GET NCHNS FROM MAIN PROG.
	SKIPG A		;*****ALL THIS IS FOUND IN HEADER ANYWAY!!!
	MOVEI A,1		;MAKE NCHNS=1 IF IT WASN'T
	DPB	A,[POINT 2,DACPAR,35]
	SETZM REP	; FOR SPEED CHNGS WITH HEADER

SPD:	MESSAGE [ASCIZ/
  SPEED?, <CR>, OR "X" /]
	READCH  A
	SETOM REPT#
	CAIE	A,"X"
	JRST .+3
	MESSAGE [ASCIZ/ ****PLEASE DELETE TEST.SND**** /]
	JRA	16,2(16)
	CAIN A,15	; IS IT A CRLF???
	JRST CRLF	; YES
	CAIN A,"R"		;"Rn" REPEATS PLAY n TIMES
	JRST REP3
	CAIG A,"5"		;IS IT 1 - 5?
	JRST SPD2		;YES
	SKIPN DIR+3		;IS THIS THE 1ST TIME THRU?
	JRST SPD		;YES, SO WE NEED A GOOD NUM.
	JRST PLA2		;ELSE GO PLAY SAME AS LAST TIME
REP3:	READCH A		;WHAT FOLLOWS R?
	SUBI A,"0"		;FIX IT UP
	CAILE A,=9		;IF(A.GT.9)A=1  TRAPS "G" ETC.
	MOVEI A,1
	MOVNM A,REPT		
	MOVE A,SAVSPD		;GET BACK SPEED.
	JRST SPD3

CRLF:	READCH A		;GET THE LINEFEED
	MOVE A,SAVSPD
	JRST SPD3
SPD2:	SUBI	A,"0"
	MOVEM A,SAVSPD#		;SAVE AC A.
SPD3:	DPB	A,[POINT 3,DACPAR,26]

PLA2:	SETZM DIR+3
	LOOKUP	DSKCHN,DIR   
	SKIPA			;CAN'T FIND TEST.SND
	JRST XOPEN		;FOUND IT

MUS:	JRST	[MESSAGE[ASCIZ/
		*** TEST.SND NOT FOUND/]
		CALLI  12]
        ;EXIT IF FILE IS MISSING

XOPEN:	OPEN	ADCHN,[1B27+117	;MODE
         	'DAC   '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS
	SKIPA
	JRST SPWAR-1		;WE GOT THE DAC, NOW TRY FOR THE XGP!
        MESSAGE [ASCIZ/
WAITING FOR DAC------ /]
	OPEN  ADCHN,[1B26+117	;WE'LL WAIT FOR IT
		  'DAC   '
		  0]
	0			;NO FAILURE POSSIBLE?????
	MTAPE ADCHN,DACPAR

SPWAR:	HRRZ	A,JOBREL
	HRRZM	A,OLDREL#
	HRRZM	A,BUF1
	HRRZI	A,1(A)
	HRRM	A,HEADER
	ADDI	A,BUFSIZ
	HRRZM	A,BUF2
	ADDI	A,BUFSIZ+1
	HRRZM	A,BUF3
	ADDI	A,BUFSIZ+2
	CORE	A,
	JRST	[OUTSTR[ASCIZ/
	CAN'T GET CORE!
/]↔	JRA	16,2(16)]

	LOCK A,			;SPWAR:

DOIT:	SETO BUFCNT,		;KEEP TRACK OF WHICH BUFFER, FOR REPLAY
	SKIPE REP		;SKIP FIRST TIME
	JRST REPLA		;OMIT HEADER ON REPLAYS
	MOVEI REP,1 		;FOR REPLAY
	INPUT DSKCHN,HEADER
	HRRZ A,HEADER
	HRRZ B,1(A)
	CAIE B,525252	; LOOKS FOR MAGIC NUMBER.
	JRST REPLA
;;	MESSAGE [ASCIZ/			;****ALWAYS HEADER NOW 3/77
;;---- THERE'S A HEADER ---- /]
	HLRZ B,2(A)			;GET SPEED FROM LEFT HALF OF WD 2
	DPB B,[POINT 3,DACPAR,26]		;PUT AWAY THE SPEED
	HRRZ B,3(A)			;GET BITS FROM RIGHT HALF OF WD 3
	DPB B,[POINT 2,DACPAR,29]			;12 OR 18 BIT
	MOVE B,4(A)			;GET NCHNS FROM WD 4
	DPB B,[POINT 2,DACPAR,35]
	MTAPE ADCHN,DACPAR	;NOW USE ALL THE STUFF FROM THE HEADER
	MOVEI REP,2		;FOR REPLAY
	SKIPA
REPLA:	USETI DSKCHN,(REP)	;REP=1 IF NO HEADER, =2 WITH HEADER.
LNTH:	movs a,DIR+3		;get length of file.
	CAIN REP,2		;WAS THERE A HEADER?
	ADDI A,200		;YES, SUBTRACT IT FROM WDCNT.
	movnm a,nwd
;-----------------------------------------------------

	;BEGIN MAIN BODY OF PROGRAM

	MOVE T1,[647003,,0]
	ADSMAP T1,	; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
			; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAIT FOR
			; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
			; DELAY BEEPS TO END OF XFR.
	OUTSTR [ASCIZ /
TO DAC . . ./]
	JUMPE BUFCNT,LOOP2	;FOR REPLAYS
	JUMPG BUFCNT,LOOP3
LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
BUF1:	0
	AOS BUFCNT
	JUMPLE	B,DONE    	;DONE
	
LOOP2:	JSP RET,SUB
BUF2:	0
	AOS BUFCNT
	JUMPLE B,DONE

LOOP3:	JSP	RET,SUB		;CALL IT AGAIN
BUF3:	0
	SETO BUFCNT,		;RE-INIT BUFFER COUNTER, FOR REPLAYS
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

DONE:	AOSGE REPT		;UPDATE REPT
	JRST REPLA		;WE PLAY AGAIN IF REPT .LT.0
;;;DONE:	AOS A,REPT		;UPDATE REPT
;;;	JUMPGE A,.+3		;REPEAT IF .LE.0
;;;	USETI DSKCHN,1		;GET BACK TO HEAD OF FILE.
;;;	JRST LNTH
	close dskchn,		;END OF PROGRAM.
	releas adchn,
	OUTSTR [ASCIZ / DONE!
/]
	SETO T1,
	ADSMAP T1,	; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
	UNLOCK
	HRRZ	A,OLDREL
	CORE	A,
	JRST [OUTSTR[ASCIZ/DONK??!!/]↔JRA 16,2(16)]
	jrst SPD

	;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE OUTSIDE.

SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,NWD		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	MOVSM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,OUTWC		;SAME FOR OUTPUT.
	INPUT	DSKCHN,INLIST	;READ A RECORD.
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	JRST	1(RET)		;RETURN
;---------------------------------------------------------

; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
;↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
;BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2
;BUF3:	BLOCK	BUFSIZ+1	;BUFFER 3
DIR:	0    			;NAME
	0			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#
CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0
INLIST:	0			;WILL CONTAIN AN IOWD
	0
HEADER:	IOWD =128,BUF1
	0
OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2
DACPAR:	1001		;SPEED 0=6.4K, 1=12.8, 2=25.6, 3=51.2, 4=102.4, 5=
	0
	0


A←1
B←2
D←3

ichn←adchn

END